libxl, hvm: Add support to trigger power or sleep button events
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 20 Jan 2010 20:36:19 +0000 (20:36 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 20 Jan 2010 20:36:19 +0000 (20:36 +0000)
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
tools/libxl/libxl.c
tools/libxl/libxl.h
tools/libxl/xl.c

index 7b7289f86389069c87520fc916952220f6aa2a58..168970554761dc5fe2d4c832d25f4c617cc76ef7 100644 (file)
@@ -2198,3 +2198,21 @@ int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t targ
     rc = xc_domain_memory_set_pod_target(ctx->xch, domid, (target_memkb - videoram) / 4, NULL, NULL, NULL);
     return rc;
 }
+
+int libxl_button_press(struct libxl_ctx *ctx, uint32_t domid, libxl_button button)
+{
+    int rc = -1;
+
+    switch (button) {
+    case POWER_BUTTON:
+        rc = xc_domain_send_trigger(ctx->xch, domid, XEN_DOMCTL_SENDTRIGGER_POWER, 0);
+        break;
+    case SLEEP_BUTTON:
+        rc = xc_domain_send_trigger(ctx->xch, domid, XEN_DOMCTL_SENDTRIGGER_SLEEP, 0);
+        break;
+    default:
+        break;
+    }
+
+    return rc;
+}
index 9b69772658fd76e80a9ef5eeb9cb7a893e0a5bb1..84e412a0c63e41c012ce4271bc01c329cbb8e7ad 100644 (file)
@@ -353,4 +353,12 @@ int libxl_device_pci_init(libxl_device_pci *pcidev, unsigned int domain,
                           unsigned int bus, unsigned int dev,
                           unsigned int func, unsigned int vdevfn);
 
-#endif
+typedef enum {
+    POWER_BUTTON,
+    SLEEP_BUTTON
+} libxl_button;
+
+int libxl_button_press(struct libxl_ctx *ctx, uint32_t domid, libxl_button button);
+
+#endif /* LIBXL_H */
+
index 34eefef5b262d540b147702d246011b483198933..694a95036085f35d74759772131694d63cccb1c0 100644 (file)
@@ -931,6 +931,7 @@ static void help(char *command)
         printf(" cd-insert                     insert a cdrom into a guest's cd drive\n\n");
         printf(" cd-eject                      eject a cdrom from a guest's cd drive\n\n");
         printf(" mem-set                       set the current memory usage for a domain\n\n");
+        printf(" button-press                  indicate an ACPI button press to the domain\n\n");
     } else if(!strcmp(command, "create")) {
         printf("Usage: xl create <ConfigFile> [options] [vars]\n\n");
         printf("Create a domain based on <ConfigFile>.\n\n");
@@ -984,6 +985,10 @@ static void help(char *command)
     } else if (!strcmp(command, "mem-set")) {
         printf("Usage: xl mem-set <Domain> <MemKB>\n\n");
         printf("Set the current memory usage for a domain.\n\n");
+    } else if (!strcmp(command, "button-press")) {
+        printf("Usage: xl button-press <Domain> <Button>\n\n");
+        printf("Indicate <Button> press to a domain.\n");
+        printf("<Button> may be 'power' or 'sleep'.\n\n");
     }
 }
 
@@ -1718,6 +1723,60 @@ int main_create(int argc, char **argv)
     exit(0);
 }
 
+void button_press(char *p, char *b)
+{
+    struct libxl_ctx ctx;
+    uint32_t domid;
+    libxl_button button;
+
+    libxl_ctx_init(&ctx, LIBXL_VERSION);
+    libxl_ctx_set_log(&ctx, log_callback, NULL);
+
+    if (domain_qualifier_to_domid(&ctx, p, &domid) < 0) {
+        fprintf(stderr, "%s is an invalid domain identifier\n", p);
+        exit(2);
+    }
+
+    if (!strcmp(b, "power")) {
+        button = POWER_BUTTON;
+    } else if (!strcmp(b, "sleep")) {
+        button = SLEEP_BUTTON;
+    } else {
+        fprintf(stderr, "%s is an invalid button identifier\n", b);
+        exit(2);
+    }
+
+    libxl_button_press(&ctx, domid, button);
+}
+
+int main_button_press(int argc, char **argv)
+{
+    int opt;
+    char *p;
+    char *b;
+
+    while ((opt = getopt(argc, argv, "h")) != -1) {
+        switch (opt) {
+        case 'h':
+            help("button-press");
+            exit(0);
+        default:
+            fprintf(stderr, "option not supported\n");
+            break;
+        }
+    }
+    if (optind >= argc - 1) {
+        help("button-press");
+        exit(2);
+    }
+
+    p = argv[optind];
+    b = argv[optind + 1];
+
+    button_press(p, b);
+    exit(0);
+}
+
 int main(int argc, char **argv)
 {
     if (argc < 2) {
@@ -1757,6 +1816,8 @@ int main(int argc, char **argv)
         main_cd_eject(argc - 1, argv + 1);
     } else if (!strcmp(argv[1], "mem-set")) {
         main_memset(argc - 1, argv + 1);
+    } else if (!strcmp(argv[1], "button-press")) {
+        main_button_press(argc - 1, argv + 1);
     } else if (!strcmp(argv[1], "help")) {
         if (argc > 2)
             help(argv[2]);